package cn.itcast.dmp.runner

import cn.itcast.dmp.config.AppConfigHelper
import cn.itcast.dmp.report._
import cn.itcast.dmp.untils.SparkSessionUtils
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.storage.StorageLevel
//这个是主类，生成各种报表
object DailyReportRunner {
  def main(args: Array[String]): Unit = {
    // 第一、创建SparkSession
    val spark: SparkSession = SparkSessionUtils.createSparkSession(this.getClass)
    // 第二、加载ods表的数据  读取ods表的数据得到DataFrame数据
    import cn.itcast.dmp.untils.KuduUtils._
    //读取表的数据
    val odsDFOption: Option[DataFrame] = spark.readKuduTable(AppConfigHelper.AD_MAIN_TABLE_NAME)
    val odsDF: DataFrame = odsDFOption match {
      case Some(df) => df
      case None => println("未读取到ODS表的广告数据，请确认广告数据ETL保存Kudu表中。。。"); return
    }
    //如果不想换行，就用分号
    // 由于所有报表都是对ODS表数据进行统计分析，被使用多次，可以考虑缓存
    odsDF.persist(StorageLevel.MEMORY_AND_DISK)
    odsDF.count()  // 触发缓存DataFrame数据

    // TODO: 不同业务类型报表分析，并将结果数据存储Kudu表中
    // a. 各地域分布统计：region_stat_analysis
    ReportRegionProcessor.processData(odsDF)
    // b. 广告区域统计：ads_region_analysis
    ReportAdsRegionProcessor.processData(odsDF)
    // c. 广告APP统计：ads_app_analysis
    ReportAdsAppProcessor.processData(odsDF)
    // d. 广告设备统计：ads_device_analysis
    ReportAdsDeviceProcessor.processData(odsDF)
    // e. 广告网络类型统计：ads_network_analysis
    ReportAdsNetworkProcessor.processData(odsDF)
    // f. 广告运营商统计：ads_isp_analysis
    ReportAdsIspProcessor.processData(odsDF)
    // g. 广告渠道统计：ads_channel_analysis
    ReportAdsChannelProcessor.processData(odsDF)

  }
}
